在Kanzi Studio 工程中,着色器方案作为文件存储在计算机硬盘驱动器中。将着色器添加到 Kanzi Studio 工程的 <KanziWorkspace>/Projects/<ProjectName>/Shaders 目录时,Kanzi Studio 自动在素材库 (Library) > 资源文件 (Resource Files) > 着色器 (Shaders) 中显示它们。
当您想要将所有堆栈材质类型从基于片段的着色器更改为基于顶点的着色器时,或者相反,则访问着色器文件非常有用。要这么做时,如果文件名相同,请使用文件系统上的正确版本替换着色器文件。
生成自己的着色的最快方法是在 Kanzi 材质库中找到类似的用例,然后修改着色器和材质属性,或者使用 VertexPhong 或 VertexPhongTextured 材质类型中的着色器作为模板。
您可以使用 Kanzi Studio 着色器源编辑器 (Shader Source Editor) 编辑着色器源代码。使用 Kanzi Studio 着色器源编辑器 (Shader Source Editor) 时请记住:
着色器程序的输入为顶点特性和 uniform。每个顶点的特性是不同的,并且会提供给顶点着色器。您可以使用 uniform 作为顶点或片段着色器的输入。
网格的顶点缓冲区也包含一组特性。这些顶点缓冲区特性用于向顶点着色器发送数据。
Kanzi 可以自动将特性传递到着色器程序,但您也可以手动配置这些设置。
顶点特性总是具有这些语义之一,并且 Kanzi 会自动识别这些名称:
特性 (Attribute) | 数据类型 | 描述 (Description) |
---|---|---|
kzPosition | vec3 | 位置 |
kzNormal | vec3 | 正常 (Normal) |
kzTangent | vec3 | 切线 |
kzWeight | vec4 | 权重 (Weight) |
kzMatrixIndices | vec4 | 矩阵调色板 |
kzTextureCoordinate0 | vec2 | 纹理坐标 0 |
kzTextureCoordinate1 | vec2 | 纹理坐标 1 |
kzTextureCoordinate2 | vec2 | 纹理坐标 2 |
kzTextureCoordinate3 | vec2 | 纹理坐标 3 |
kzColor0 | vec4 | 颜色 0 |
kzColor1 | vec4 | 颜色 1 |
kzColor2 | vec4 | 颜色 2 |
kzColor3 | vec4 | 颜色 3 |
kzMorphTarget0Position | vec3 | 变形目标位置 0 |
kzMorphTarget1Position | vec3 | 变形目标位置 1 |
kzMorphTarget2Position | vec3 | 变形目标位置 2 |
kzMorphTarget3Position | vec3 | 变形目标位置 3 |
kzMorphTarget0Normal | vec3 | 变形目标法线 0 |
kzMorphTarget1Normal | vec3 | 变形目标法线 1 |
kzMorphTarget2Normal | vec3 | 变形目标法线 2 |
kzMorphTarget3Normal | vec3 | 变形目标法线 3 |
kzMorphTarget0Tangent | vec3 | 变形目标切线 0 |
kzMorphTarget1Tangent | vec3 | 变形目标切线 1 |
kzMorphTarget2Tangent | vec3 | 变形目标切线 2 |
kzMorphTarget3Tangent | vec3 | 变形目标切线 3 |
您还可以添加自定义特性。
如果着色器特性和顶点特性之间存在一对一的关系,则这些特性会自动互相映射。您可以手动将映射配置为在网格数据中以不同的方式工作。如果使用不在默认列表中的着色器特性名称,则必须使用手动映射。
要查看和编辑材质类型的着色器特性的语义,在 素材库 (Library) > 材质和纹理 (Materials and Textures) > 材质类型 (Material Types) 中右键点击材质类型并选择打开着色器特性编辑器 (Open Shader Attributes Editor)。
着色器 uniform 可以从以下数据源接收其数据:
如果 uniform 名称与任何 Kanzi 默认 uniform 匹配,Kanzi Engine 会自动将它的值发送至着色器程序。默认情况下,提供以下 uniform 变量:
Uniform | 数据类型 | 描述 (Description) |
---|---|---|
ContentTexture | sampler2D | 渲染时渲染节点提供的纹理,例如 图像 (Image) 节点中显示的图像。请参阅 应用自定义渲染到 2D 节点 和 应用自定义渲染到图像 (Image) 节点。 |
RenderOpacity | float | 渲染 2D 节点的不透明度。请参阅 应用自定义渲染到 2D 节点 和 应用自定义渲染到图像 (Image) 节点。 |
kzWorldMatrix | mat4 | 从本地坐标变换为世界(全局)坐标的变换矩阵。 |
kzCameraMatrix | mat4 | 从世界(全局)坐标变换到视图(摄像机)坐标的矩阵,即应用摄像机。 |
kzCameraWorldMatrix | mat4 | 预乘矩阵: kzCameraMatrix * kzWorldMatrix |
kzProjectionCameraWorldMatrix | mat4 | 预乘矩阵: kzProjectionmatrix * kzCameraMatrix * kzWorldMatrix |
kzProjectionMatrix | mat4 | 将视图坐标投影到屏幕坐标的矩阵 |
kzNormalMatrix | mat4 | 将对象法线变换为世界坐标的矩阵 |
kzCameraNormalMatrix | mat4 | 预乘矩阵: kzCameraMatrix * kzNormalMatrix |
kzCameraPosition | vec3 | 世界坐标中的摄像机位置 |
kzTime | float | 调试计时器,1.0f = 1000 毫秒。 |
kzTexture | sampler2D | 应用到笔刷或材质的纹理 |
kzTextureSize0 | vec2 | 着色器中第一个纹理的 (width, height ) 外形尺寸 |
kzTextureSize1 | vec2 | 着色器中第二个纹理的 (width, height ) 外形尺寸 |
kzTextureSize2 | vec2 | 着色器中第三个纹理的 (width, height ) 外形尺寸 |
kzTextureSize3 | vec2 | 着色器中第四个纹理的 (width, height ) 外形尺寸 |
kzMatrixPalette | vec4 | 用于顶点蒙皮的 4x3 矩阵数组。每个矩阵采用以下形式:[ m00 m01 m02 translate_x] |
kzCameraNearFarPlane | vec2 | 距离摄像机的近平面距离和远平面距离 |
kzMorphWeights[8] | float | 变形中使用的网格权重数组 |
kzViewport | vec4 | 从标准化设备坐标变换为屏幕(窗口)坐标的形式 vector (x, y, width, height )。设置视口的位置和大小:
|
kzWindowSize | vec2 | 应用程序屏幕 (Screen) 节点的尺寸 (width, height ) |
如果 uniform 的名称与着色器的材质类型中定义的任何属性类型匹配,则使用属性提供值。在运行时,从渲染材质以及与材质类型中定义的光源属性匹配的光源收集属性的值,可能会重写属性。
uniform 的名称和数据类型必须与材质类型中的属性类型的名称和数据类型相匹配。请注意,属性类型的显示名称可能与上下文中使用的实际名称不同。请参阅 属性类型。例如,如果材质类型的颜色属性类型为漫射 (Diffuse),则着色器代码必须具有以下定义:
uniform mediump vec4 Diffuse;
名称中的字母和大小写必须匹配。以下列出了从属性数据类型到着色器 uniform 数据类型的兼容数据类型:
属性数据类型 | 着色器 uniform 数据类型 |
---|---|
浮点 (Float) | float |
Vector 2D | vec2 |
Vector 3D | vec3 |
颜色 (Color) | vec4 |
Vector 4D | vec4 |
2D 矩阵 (Matrix 4x4) | mat2 |
3D 矩阵 (Matrix 4x4) | mat3 |
4D 矩阵 (Matrix 4x4) | mat4 |
纹理 (Texture) | sampler1D sampler2D sampler3D sampler1DShadow sampler2DShadow samplerCube |
光源属性类型支持 uniform 数组。这使您可以使用多个类型相同的灯源。例如,如果一个着色器程序使用两个方向光源,则您必须将数组属性类型添加到该材质类型的着色器中:
uniform mediump vec4 DirectionalLightColor[2]; uniform mediump vec3 DirectionalLightDirection[2];
以下属性类型支持 uniform 数组:
有关详细信息,请参阅 API reference 中的 ShaderProgram
类。